<?xml version="1.0" encoding="UTF-8"?>
<!-- ******************************************************************************************** -->
<!-- ******************************************************************************************** -->
<!-- ****************************OBSOLET - OBSOLET - OBSOLET ************************************ -->
<!-- **** Diese application-context.xml ist obsolet. Diese Konfiguration von Spring ist ********* -->
<!-- **** ist veraltet. Sie wurde für frühere Entwicklungen verwendet und wurde seit der ******** -->
<!-- **** Integration der Unittests durch andere ersetzt. Neue sind zu finden im Classpath. ***** -->
<!-- *****Diese application-context.xml wurde aber nicht gelöscht (aus historischen Gründen)! *** -->
<!-- ******************************************************************************************** -->
<!-- ******************************************************************************************** -->


<!-- ******************************************************************************************** -->
<!-- SCHRITT 1: BEANS Anfangselement -->
<!-- beinhaltet Vorschriften, welche Elemente man definieren kann. (Standard). -->
<!-- ******************************************************************************************** -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">



<!-- ******************************************************************************************** -->
<!-- SCHRITT 2: PACKAGEDEFINITON FÜR CONTROLLER-SUCHE -->
<!-- ******************************************************************************************** -->
<!-- component-scan: Verzeichnis, dass nach Controllern durchsucht wird. -->
<!-- Anhand von Annotationen in den darin enthaltenen Klassen wird diese Klasse als Controller identifiziert. -->
<!-- ******************************************************************************************** -->
	<!-- Controllerdefinitionen: Define the controllers using annotations -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
	<context:component-scan base-package="de.fhd.pms.ctrl"/>


<!-- ******************************************************************************************** -->
<!-- SCHRITT 3: DATENBANKINFORMATIONEN -->
<!-- ******************************************************************************************** -->
<!-- In dem Moment während Spring diesen Context liest, wird die Methode "initDB" der Klasse "Startup" aufgerufen. -->
<!-- Mithilfe dieser Properties werden die Instanzenvariablen mit Werten indiziert (injection) -->
<!--  -->
<!-- class="de.fhd.pms.Startup" - Diese Klasse hat nur den Zweck, wenn die Applikation das erste mal Aufgerufen wird, -->
<!-- id="init" -->
<!-- init-method="initDB" ==> Methode der Klasse Startup (Datenbank anlegen) -->
<!--    driverClass ==> Klasse, die als Datenbanktreiber fungiert -->
<!--    user ==> Username für den Zugriff auf die Datenbank -->
<!--    password ==> Passwort des Users für den Zugriff auf die Datenbank -->
<!--    defaultDBurl ==> man benötigt eine existierende Datenbank jdbc:mysql://... ist Standardatenbank von Mysql und somit immer verfügbar -->
<!--    newDB ==> Name der Datenbank, die in der Webapplikation "Carsharing" verwendet wird -->
<!--  -->
<!-- Spring will durch diese Bean eine Instanz der Klasse Startup erzeugen (ToDo: Klasse Startup anlegen) -->
<!-- ******************************************************************************************** -->
    <bean class="de.fhd.pms.Startup" id="init" init-method="initDB">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="user" value="root" />
		<property name="password" value="" />
		<property name="defaultDBurl" value="jdbc:mysql://localhost:3306/mysql" />
		<property name="newDB" value="carsharingV5" />
    </bean>


<!-- ******************************************************************************************** -->
<!-- SCHRITT 4: DATASOURCE (DATENQUELLE) -->
<!-- ******************************************************************************************** -->
<!-- Diese stellt die tatsächliche Datenbankverbindung zur Verfügung (nicht selbst programmiert). -->
<!--    depends-on: bedeutet, dass diese Instanziierung erst gemacht werden kann, -->
<!--                wenn zuvor die Bean mit der id="init" durchlaufen wurde. (In SCHRITT 3 definiert) -->	
<!-- ******************************************************************************************** -->
	<bean id="datasource-carsharing"
		class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close"
		depends-on="init">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/carsharingV5" />
		<property name="user" value="root" />
		<property name="password" value="" />
		<property name="minPoolSize" value="2" />
      	<property name="maxPoolSize" value="4" />
	</bean>


<!-- ******************************************************************************************** -->
<!-- SCHRITT 5: HIBERNATE SESSION FACTORY -->
<!-- ******************************************************************************************** -->
<!--    - ref: bezieht sich auf die, in Schritt 4 erstellte Datasource mit der Bean id="datasource-carsharing" -->
<!--    - Properety "dataSource" ist eine Instanzenvariable, in die die zuvor erstellte Instanz eingespeist (injiziert) wird.-->
<!--      Durch die Angabe des Objektes in der Property ref besteht die Möglichkeit ganze Instanzen einzuschleusen. -->
<!--      In diesem Fall wird ein ein dataSource-Objekt eingeschleust. -->
<!--    - In der Property "annotatedClasses" werden alle Model-Objekte als Liste angegeben -->
<!-- ******************************************************************************************** -->		
	<bean id="hibernateSessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="datasource-carsharing" />
		<property name="annotatedClasses">
			<list>
				<value>de.fhd.pms.model.Teilnehmer</value>
				<value>de.fhd.pms.model.Automobil</value>
				<value>de.fhd.pms.model.Standort</value>
				<value>de.fhd.pms.model.Fahrt</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
			</props>
		</property>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="hibernateSessionFactory" />
	</bean>
     
<!-- ******************************************************************************************** -->
<!-- SCHRITT 6: DATA ACCESS OBJECTS -->
<!-- ******************************************************************************************** -->
<!-- Die Data Access Objects gewähren den Zugriff auf die Datenbank -->
<!-- ******************************************************************************************** -->
	<bean id="teilnehmerDao" class="de.fhd.pms.dao.TeilnehmerDao">
		<property name="sessionFactory" ref="hibernateSessionFactory"/>
		<property name="fahrtDao" ref="fahrtDao"/>
	</bean>
	<bean id="automobilDao" class="de.fhd.pms.dao.AutomobilDao">
		<property name="sessionFactory" ref="hibernateSessionFactory"/>
		<property name="fahrtDao" ref="fahrtDao"/>
	</bean>
	<bean id="standortDao" class="de.fhd.pms.dao.StandortDao">
		<property name="sessionFactory" ref="hibernateSessionFactory"/>
	</bean>
	<bean id="fahrtDao" class="de.fhd.pms.dao.FahrtDao">
		<property name="sessionFactory" ref="hibernateSessionFactory"/>
	</bean>

<!-- ******************************************************************************************** -->
<!-- SCHRITT 7: CONTROLLERS -->
<!-- ******************************************************************************************** -->
<!-- Text -->
<!-- ******************************************************************************************** -->
	<bean id="teilnehmerController" class="de.fhd.pms.ctrl.TeilnehmerController">
		<property name="teilnehmerDao" ref="teilnehmerDao"/>
	</bean>
	<bean id="automobilController" class="de.fhd.pms.ctrl.AutomobilController">
		<property name="automobilDao" ref="automobilDao"/>
		<property name="standortDao" ref="standortDao"/>
	</bean>
	<bean id="standortController" class="de.fhd.pms.ctrl.StandortController">
		<property name="standortDao" ref="standortDao"/>
	</bean>
	<bean id="fahrtController" class="de.fhd.pms.ctrl.FahrtController">
		<property name="fahrtDao" ref="fahrtDao"/>		
		<property name="teilnehmerDao" ref="teilnehmerDao"/>
		<property name="automobilDao" ref="automobilDao"/>
		<property name="standortDao" ref="standortDao"/>
	</bean>
	<bean id="rechnungController" class="de.fhd.pms.ctrl.RechnungController">
		<property name="fahrtDao" ref="fahrtDao"/>		
		<property name="teilnehmerDao" ref="teilnehmerDao"/>
		<property name="automobilDao" ref="automobilDao"/>
		<property name="standortDao" ref="standortDao"/>
	</bean>

<!-- ******************************************************************************************** -->
<!-- SCHRITT 8: VIEWS -->
<!-- ******************************************************************************************** -->
<!-- Hier wird die Auflösung von Views definiert. Bei der Rückgabe einer bestimmten View durch den Controller -->
<!-- mit einem darin definierten Namen (z.B. "home") wird hier der Pfad im WebContent zusammengestellt. -->
<!--    prefix: stellt dem Namen der View das Verzeichnis voran, d.h. "home" wird zu "/view/home" -->
<!--    suffix: fügt dem Namen mit prefix der View den Dateityp hinzu, d.h. "/view/home.jsp" -->
<!-- Spring versucht nun die Datei unter "/view/home.jsp" im WebContent-Verzeichnis zu öffnen und im Browser darzustellen -->
<!-- ******************************************************************************************** -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/view/" />
		<property name="suffix" value=".jsp" />
	</bean>


</beans>